package CargaJuego;

import java.util.HashMap;

import General.Constantes;
import Logica.Mario;
import Logica.Celdas.Caja;
import Logica.Celdas.CajaMoneda;
import Logica.Celdas.Celda;
import Logica.Celdas.Ladrillo;
import Logica.Celdas.Llegada;
import Logica.Celdas.Piso;
import Logica.Celdas.Vacio;
import Logica.PowerUps.BombaNuclear;
import Logica.PowerUps.Estrella;
import Logica.PowerUps.FlorFuego;
import Logica.PowerUps.HongoRojo;
import Logica.PowerUps.HongoVerde;

/**
 * Mapeo de caracteres para cargar un nivel. Realiza un mapeo desde un caracter (char) a una Celda..
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public class MapeoCaracteresCeldas {
	/* ################## ATRIBUTOS DE INSTANCIA ######################## */
	protected HashMap<Character, Celda> mapeo;
	protected Mario mario;

	/* ################## CONSTRUCTORES ######################## */
	/**
	 * Constructor para un mapeo de caracteres para cargar un nivel. El constructor inicializa el
	 * estado interno y realiza el mapeo .
	 * 
	 * @param carg
	 *            - cargador necesario para obtener los spriteMovements
	 */
	public MapeoCaracteresCeldas(Cargador carg) {
		mapeo = new HashMap<Character, Celda>();
		cargarMapa(carg);
	}

	/* ################## CONSULTAS ######################## */
	/**
	 * Obtiene una celda a partir de una clave dada.
	 * 
	 * @param clave
	 * @return una celda a partir de una clave dada.
	 */
	public Celda getCelda(Character clave) {
		return mapeo.get(clave);
	}

	public Mario getMario() {
		return mario;
	}

	/* ################## METODOS DE LA CLASE ######################## */
	/*
	 * Se necesita el cargador para poder obtener los SpriteMovements (se asume que estos mismos
	 * fueron cargados por el cargador previamente) de las celdas
	 */
	private void cargarMapa(Cargador carg) {
		Celda caja = null;
		Celda ladrillo = null;
		Celda vacio = null;
		Celda nada = null;
		Celda piso = null;
		Celda llegada = null;
		Celda cajaM = null;

		HongoVerde hongoVerde = new HongoVerde(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniHongoVerde(), carg.getIg());
		hongoVerde.setInteligencia(carg.getIntel());
		hongoVerde.setDirActual(Constantes.dir_right);

		HongoRojo hongoRojo = new HongoRojo(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniHongoRojo(), carg.getIg());
		hongoRojo.setInteligencia(carg.getIntel());
		hongoRojo.setDirActual(Constantes.dir_right);

		BombaNuclear bombaNuclear = new BombaNuclear(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniBombaNuclear(), carg.getIg());
		bombaNuclear.setInteligencia(carg.getIntel());
		bombaNuclear.setDirActual(Constantes.dir_right);

		Estrella estrella = new Estrella(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniEstrella(), carg.getIg());
		estrella.setInteligencia(carg.getIntel());
		estrella.setDirActual(Constantes.dir_right);

		FlorFuego florFuego = new FlorFuego(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniFlorFuego(), carg.getAniProyectil(), carg.getIg());
		florFuego.setInteligencia(carg.getIntel());
		florFuego.setDirActual(Constantes.dir_right);
		florFuego.crearProyectil();

		// 'L' corresponde a un ladrillo
		Character l = new Character('7');
		ladrillo = new Ladrillo(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniLadrillos(), carg.getIg());
		ladrillo.setInteligencia(carg.getIntel());
		mapeo.put(l, ladrillo);

		// '0' corresponde a una caja sin nada
		Character c0 = new Character('0');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), null);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c0, caja);

		// '1' corresponde a una caja con un hongoRojo
		Character c1 = new Character('1');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), hongoRojo);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c1, caja);

		// '2' corresponde a una caja con un hongoVerde
		Character c2 = new Character('2');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), hongoVerde);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c2, caja);

		// '3' corresponde a una caja con un Bomba Nuclear
		Character c3 = new Character('3');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), bombaNuclear);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c3, caja);

		// '4' corresponde a una caja con un Estrella
		Character c4 = new Character('4');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), estrella);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c4, caja);

		// '5' corresponde a una caja con una flor
		Character c5 = new Character('5');
		caja = new Caja(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getIg(), florFuego);
		caja.setInteligencia(carg.getIntel());
		mapeo.put(c5, caja);

		// 'P' corresponde al piso
		Character p = new Character('8');
		piso = new Piso(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniPisos(), carg.getIg());
		caja.setInteligencia(carg.getIntel());
		mapeo.put(p, piso);

		// 'M' corresponde a una caja con una moneda.
		Character m = new Character('6');
		cajaM = new CajaMoneda(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniCajas(), carg.getAniMonedas(), carg.getIg(), null);
		cajaM.setInteligencia(carg.getIntel());
		mapeo.put(m, cajaM);

		// 'V' corresponde a vacio
		Character v = new Character('A');
		vacio = new Vacio(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniVacio(), carg.getIg());
		vacio.setInteligencia(carg.getIntel());
		mapeo.put(v, vacio);

		// 'F' corresponde al final del mapa
		Character f = new Character('9');
		llegada = new Llegada(Constantes.sizeCelda, Constantes.sizeCelda, carg.getAniLlegada(), carg.getIg());
		llegada.setInteligencia(carg.getIntel());
		mapeo.put(f, llegada);

		// 'N' corresponde a nada
		Character n = new Character('Z');

		nada = null;
		mapeo.put(n, nada);

	}

}
